package suanfa;

public class RandomTest3 {
    public static void main(String[] args) {
        int randomTimes = 1000000;
        //返回0-7之间的数，那大小就是8
        int[] nums = new int[8];
        for (int i = 0; i < randomTimes; i++) {
            nums[f0d7()]++;
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.println(i + "出现了" + nums[i] + "次");
        }
    }

    private static int f0d7() {
        //这里只能依赖f0d5函数
        //我们在这里新增了一个函数randomBit目的是随机等概率返回0和1的数字，让他去依赖f0d5函数
        //下面的这个方法就是取随机的3位二进制，因为每一位都是随机的0或1，那么这个二进制也是随机的
        //最后返回该二进制的10进制整数就是0-7范围内的随机数
        return (randomBit() << 2) + (randomBit() << 1) + randomBit();
    }

    //这个函数只能依赖f0d5函数返回随机等概率返回0和1的数字
    //因为0-5是等概率的，所以如果返回的是0，则重新随机直到返回的只有[1-5)4个数字
    //其中如果得到1和2时返回1，否则返回0
    private static int randomBit() {
        int val = f0d5();
        while (val == 0) {
            val = f0d5();
        }
        return val < 3 ? 1 : 0;
    }

    private static int f0d5() {
        return (int) (Math.random() * 5);
    }
}
